#ifndef __BSP_TASK_H
#define __BSP_TASK_H

#include "main.h"

#define TASK_MAX 3      // 最多任务数
#define TASK_NODE_MAX 5 // 最多任务节点数

#define U_START 0 // 任务开始
#define U_END 1   // 任务结束
#define U_PAUSE 2 // 任务暂停
#define U_RENEW 3 // 任务恢复

typedef enum
{
    t_STOP,  // 停止
    t_RUN,   // 运行
    t_PAUSE, // 暂停
    t_RENEW, // 恢复
} u_State_e;

typedef enum
{
    t_NOK, // 未完成
    t_OK,  // 完成
    t_ERR, // 错误
} u_Task_e;

typedef enum
{
    e_OK,       // 无异常
    e_TIMEOUT,  // 超时
    e_ABNORMAL, // 异常
} u_Err_e;
// 任务处理
typedef struct
{
    u_Task_e (*ta_Task_Handle)(void);
} u_TaskHandle_t;

// 任务片段
typedef struct
{
    uint32_t ta_TimeOut;             // 超时时间(设定值)
    u_TaskHandle_t u_Task_Handle[4]; // 固定
} u_TaskLet_t;

typedef struct
{
    u_State_e t_State;                     // 状态
    uint16_t t_Proc;                       // 进度，高字节代表主任务，低字节代表状态任务
    u_Err_e t_ErrYard;                     // 超时标志
    u_TaskLet_t t_TaskNode[TASK_NODE_MAX]; // 任务片段，为了解决内存可以少开一些
    uint32_t t_Countdown;                  // 倒计时
    uint8_t t_Num;                         // 数量，任务数量不应超过10
    u_Task_e (*t_StopEvent)(void);         // 停止事件
    u_Task_e (*t_ErrEvent)(void);          // 错误事件
} u_Task_t;

void bsp_Task_Obj_Set_Run(u_Task_t *obj);
void bsp_Task_Obj_Set_Stop(u_Task_t *obj);
void bsp_Task_Obj_Set_Pause(u_Task_t *obj);
void bsp_Task_Obj_Set_Renew(u_Task_t *obj);
u_State_e bsp_Task_Obj_Get_State(u_Task_t *obj);
uint16_t bsp_Task_Obj_Get_Proc(u_Task_t *obj);

u_Task_e bsp_Task_Obj_New(u_Task_t *obj);
void bsp_Task_IRQHandler(void);
void bsp_Task_Handle(void);

#endif
